﻿using Dapper;
using System.Data;
using System.Data.SqlClient;

namespace Dapper
{
    public class Dapper简介
    {

        public Dapper简介() {

            // Dapper
            /*
                一、什么是Dapper
                    Dapper是一个简单的.Net的ORM ,在速度方面有"King of Micro ORM"的头衔，几乎与原始的ADO.Net数据读取器一样快。

                    SqlConnection,MysqlConnection,OracleConnection 这些对象都是继承自 DBConnection对象，

                    而DBConnection对象是是现实的IDBConnectiond 接口。

                    因为Dapper是对IDBConnection接口进行了扩展，比如你看到而SqlIMapper.cs 所以dapper支持多数据库。
             */

            /*
               二、Dapper是如何工作的？

                    1、创建一个IDBConnection接口对象；
                    2、编写一个查询Sql来执行CRUD操作。
                    3、将查询sql作为Excute方法的参数。
             */


            /*
                三、安装
                    Dapper通过NuGet安装：https://www.nuget.org/packages/Dapper
             */


            /*
                四、要求

                    Dapper可以与任何数据库提供者一起工作，因为没有针对特定数据库的实现。
             */

            /*
                五、方法

                    1、Excute
                    2、Query
                    3、QueryFirst
                    4、QueryFirstOrDefault
                    5、QuerySingle
                    6、QuerySingleOrDefault
                    7、QueryMultiple
             */

            /*
                六、参数
                    1、匿名类型参数：
                        var affectedRows = connection.Execute(sql,
                                                                new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"},
                                                                commandType: CommandType.StoredProcedure);

                    2、动态类型参数：

                        DynamicParameters parameter = new DynamicParameters();

                        parameter.Add("@Kind", InvoiceKind.WebInvoice, DbType.Int32, ParameterDirection.Input);
                        parameter.Add("@Code", "Many_Insert_0", DbType.String, ParameterDirection.Input);
                        parameter.Add("@RowCount", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

                        connection.Execute(sql,
                            new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"},
                            commandType: CommandType.StoredProcedure);

                    3、列表类型参数：
                        connection.Query<Invoice>(sql, new {Kind = new[] {InvoiceKind.StoreInvoice, InvoiceKind.WebInvoice}}).ToList();


                    4、字符串类型参数：
                        connection.Query<Invoice>(sql, new {Code = new DbString {Value = "Invoice_1", IsFixedLength = false, Length = 9, IsAnsi = true}}).ToList();
             */



            /*
                七、结果
                       
                      查询方法返回的结果可以映射到以下几种类型：
                        1、匿名类型：
                        2、强类型
                        3、多映射
                        4、多结果
                        5、多类型
             */
            //string sql = "SELECT * FROM Invoice;";

            //using (var connection = My.ConnectionFactory())
            //{
            //    connection.Open();

            //    var anonymousList = connection.Query(sql).ToList();
            //    var invoices = connection.Query<Invoice>(sql).ToList();
            //}


            /*
                八、工具
                        1、异步
                        2、缓冲
                        3、事务
                        4、存储过程
             */

            var connetction = new SqlConnection();

        }

    }
}
